/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package server.dataaccess;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ResourceBundle;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.log4j.Logger;
import data.Woord;

/**
 *
 * @author Liesbeth
 */
//klasse die de woordenboekfile zal inlezen en toevoegen aan de database
public class WoordenboekLoader {

    private Logger logger = Logger.getLogger(WoordenboekLoader.class);
    private ResourceBundle bundle = ResourceBundle.getBundle("server.dataaccess.database");

    public WoordenboekLoader() {
        new Thread() {
            public void run() {
                woordenboekInlezen();
            }
        }.start();

    }

    public void woordenboekInlezen() {
        String opdracht = "{call insertWoord(?,?)}";
        boolean gelukt = false;
        
        logger.debug("woordenboel wordt ingelezen");

        try {
            logger.debug("try connection");
            Connection conn = Database.getInstance().getConnection();
            try {
                logger.debug("try autocomit");
                conn.setAutoCommit(false);
                try {
                    logger.debug("try input stream");
                    FileInputStream fstream = new FileInputStream(bundle.getString("woordenboek"));
                    DataInputStream in = new DataInputStream(fstream);
                    BufferedReader br = new BufferedReader(new InputStreamReader(in));
                    String sWoord;
                    Pattern p1 = Pattern.compile("^[A-Z].*");
                    Pattern p2 = Pattern.compile(".*[0-9].*");
                    while ((sWoord = br.readLine()) != null) {
                        //logger.debug("while ((sWoord = br.readLine()) != null)) : "+ sWoord);
                        
                        Matcher m1 = p1.matcher(sWoord);
                        Matcher m2 = p2.matcher(sWoord);
                        if (!(m1.matches() || m2.matches())) {
                            //logger.debug(" if (!(m1.matches() || m2.matches()");
                            int i = 2;
                            if (sWoord.contains("é")) {
                                sWoord = sWoord.replaceAll("é", "e");
                                logger.debug("in é");
                                logger.debug("het woord is nu:"+ sWoord);
                            }
                            if (sWoord.contains("ë")) {
                                sWoord = sWoord.replaceAll("ë", "e");
                                logger.debug("in ë");
                                logger.debug("het woord is nu:"+ sWoord);
                            }
                            if (sWoord.contains("è")) {
                                sWoord = sWoord.replaceAll("è", "e");
                                logger.debug("in è");
                                logger.debug("het woord is nu:"+ sWoord);
                            }
                            if (sWoord.contains("ê")) {
                                sWoord = sWoord.replaceAll("ê", "e");
                                logger.debug("in ê");
                                logger.debug("het woord is nu:"+ sWoord);
                            }
                            if (sWoord.contains("-")) {
                                sWoord = sWoord.replaceAll("-", "");
                                logger.debug("in -");
                                logger.debug("het woord is nu:"+ sWoord);
                            }
                            if (sWoord.contains("'")) {
                                sWoord = sWoord.replaceAll("'", "");
                                logger.debug("in '");
                                logger.debug("het woord is nu:"+ sWoord);
                            }
                            if (sWoord.contains("ï")) {
                                sWoord = sWoord.replaceAll("ï", "i");
                                logger.debug("in ï");
                                logger.debug("het woord is nu:"+ sWoord);
                            }
                            if (sWoord.contains("ö")) {
                                sWoord = sWoord.replaceAll("ö", "o");
                                logger.debug("in ö");
                                logger.debug("het woord is nu:"+ sWoord);
                            }
                            if (sWoord.contains("ü")) {
                                sWoord = sWoord.replaceAll("ü", "u");
                                logger.debug("in ü");
                                logger.debug("het woord is nu:"+ sWoord);
                            }
                            if (sWoord.contains("û")) {
                                sWoord = sWoord.replaceAll("û", "u");
                                logger.debug("in û");
                                logger.debug("het woord is nu:"+ sWoord);
                            }
                            if (sWoord.contains("ä")) {
                                sWoord = sWoord.replaceAll("ä", "a");
                                logger.debug("in ä");
                                logger.debug("het woord is nu:"+ sWoord);
                            }
                            if (sWoord.contains("à")) {
                                sWoord = sWoord.replaceAll("à", "a");
                                logger.debug("in à");
                                logger.debug("het woord is nu:"+ sWoord);
                            }
                            if (sWoord.contains("ç")) {
                                sWoord = sWoord.replaceAll("ç", "c");
                                logger.debug("in ç");
                                logger.debug("het woord is nu:"+ sWoord);
                            }
                            int iLengte = sWoord.length();
                            if (iLengte <= 15) {
                                woordToevoegen(sWoord, conn, opdracht);
                            }
                        }
                    }
                    in.close();
                    conn.commit();
                } catch (FileNotFoundException fnfe) {
                    logger.error("Woordenboek bestand niet gevonden");
                    logger.error(fnfe.getMessage());
                } catch (IOException ioe) {
                    logger.error("Fout bij het inlezen woordenboek");
                    logger.error(ioe.getMessage());
                }
            } catch (SQLException ex) {
                gelukt = false;
                conn.rollback();
                logger.error("Fout bij het toevoegen van woorden in de database!");
                logger.error(ex.getMessage());
            } finally {
                conn.setAutoCommit(true);
                conn.close();
            }
        } catch (SQLException ex) {
            logger.error("Fout bij het openen of sluiten van de databaseconnectie tijdens het toevoegen van woorden in de database!");
            logger.error(ex.getMessage());
        }


    //return gelukt;
    }

    private void woordToevoegen(String sWoord, Connection conn, String opdracht) throws SQLException {
        try {
            Woord oWoord = new Woord(sWoord);
            CallableStatement cstmt = conn.prepareCall(opdracht);
            cstmt.setString(1, oWoord.getWoord());
            cstmt.setInt(2, oWoord.getLengte());
            try {
                cstmt.executeUpdate();
                //logger.info("Woord: " + oWoord.getWoord() + " toevoegen gelukt!");
                System.out.println(oWoord.getWoord());
            } catch (com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException icve) {
                logger.info("Dit woord is al eerder toegevoegd aan de database");
                logger.info(icve.getMessage());
            } finally {
                cstmt.close();
            }

        } catch (SQLException sqle) {
            throw sqle;
        }

    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new WoordenboekLoader();
            }
        });
    }
}
